﻿
namespace SistemaLogistica.DataAccess
{
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Common;
    using SistemaLogistica.Business.Entities;

    public class MantenimientoData : BaseDataAccess
    {
        private MantenimientoData() { }

        private readonly static MantenimientoData instancia = new MantenimientoData();

        public static MantenimientoData Instancia
        {
            get { return instancia; }
        }

        public List<Mantenimiento> Listar()
        {
            List<Mantenimiento> mantenimientos = new List<Mantenimiento>();
            DbCommand command = db.GetStoredProcCommand("GetAllFromMantenimiento");

            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    mantenimientos.Add(new Mantenimiento
                    {
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        Estado = dr.GetInt32(dr.GetOrdinal("Estado")),
                        FechaEntrega = dr.GetDateTime(dr.GetOrdinal("FechaEntrega")),
                        FechaIngreso = dr.GetDateTime(dr.GetOrdinal("FechaIngreso")),
                        IdMantenimiento = dr.GetInt32(dr.GetOrdinal("IdMantenimiento")),
                        Vehiculo = VehiculoData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")))
                    });
                }
            }
            mantenimientos.Reverse();
            return mantenimientos;
        }

        public List<Mantenimiento> Buscar(string placa)
        {
            List<Mantenimiento> mantenimientos = new List<Mantenimiento>();
            DbCommand command = db.GetStoredProcCommand("SearchMantenimiento");
            db.AddInParameter(command, "nroPlaca", DbType.String, placa);

            using (IDataReader dr = db.ExecuteReader(command))
            {
                while (dr.Read())
                {
                    mantenimientos.Add(new Mantenimiento
                    {
                        Descripcion = dr.GetString(dr.GetOrdinal("Descripcion")),
                        Estado = dr.GetInt32(dr.GetOrdinal("Estado")),
                        FechaEntrega = dr.GetDateTime(dr.GetOrdinal("FechaEntrega")),
                        FechaIngreso = dr.GetDateTime(dr.GetOrdinal("FechaIngreso")),
                        IdMantenimiento = dr.GetInt32(dr.GetOrdinal("IdMantenimiento")),
                        Vehiculo = VehiculoData.Instancia.ObtenerPorID(dr.GetInt32(dr.GetOrdinal("IdBien")))
                    });
                }
            }
            mantenimientos.Reverse();
            return mantenimientos;
        }

        public bool Registrar(Mantenimiento mantenimiento)
        {
            DbCommand command = db.GetStoredProcCommand("InsertMantenimiento");
            db.AddInParameter(command, "descripcion", DbType.String, mantenimiento.Descripcion);
            db.AddInParameter(command, "estado", DbType.Int32, mantenimiento.Estado);
            db.AddInParameter(command, "fechaEntrega", DbType.DateTime, mantenimiento.FechaEntrega);
            db.AddInParameter(command, "fechaIngreso", DbType.DateTime, mantenimiento.FechaIngreso);
            db.AddInParameter(command, "idBien", DbType.Int32, mantenimiento.Vehiculo.IdBien);
            db.AddOutParameter(command, "idMantenimiento", DbType.Int32, 11);

            int result = db.ExecuteNonQuery(command);

            if (result != 0) return true;
            else return false;
        }

        public bool Modificar(Mantenimiento mantenimiento)
        {
            DbCommand command = db.GetStoredProcCommand("UpdateMantenimiento");
            db.AddInParameter(command, "descripcion", DbType.String, mantenimiento.Descripcion);
            db.AddInParameter(command, "estado", DbType.Int32, mantenimiento.Estado);
            db.AddInParameter(command, "fechaEntrega", DbType.DateTime, mantenimiento.FechaEntrega);
            db.AddInParameter(command, "fechaIngreso", DbType.DateTime, mantenimiento.FechaIngreso);
            db.AddInParameter(command, "idBien", DbType.Int32, mantenimiento.Vehiculo.IdBien);
            db.AddInParameter(command, "idMantenimiento", DbType.Int32, mantenimiento.IdMantenimiento);

            int result = db.ExecuteNonQuery(command);

            if (result != 0) return true;
            else return false;
        }

        public void Eliminar(int idMantenimiento, int idBien)
        {
            DbCommand command = db.GetStoredProcCommand("DeleteMantenimiento");
            db.AddInParameter(command, "idBien", DbType.Int32, idBien);
            db.AddInParameter(command, "idMantenimiento", DbType.Int32, idMantenimiento);
            db.ExecuteNonQuery(command);
        }
    }
}
